<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport"
        content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>js对象之属性保护</title>
</head>
<body>
  <ul>
    <li>可使用Object.preventExtensions()禁止为对象添加新属性, 同时使用Object.isExtensible()检测对象是否可扩展</li>
    <li>可使用Object.seal()封闭对象(禁止添加新属性，禁止删除属性，禁止定义属性特征)，同时使用Object.isSealed()检测对象是否被封闭</li>
    <li>可使用Object.freeze()冻结对象(禁止添加新属性，禁止删除属性，禁止定义属性特征，禁止修改属性值)，同时使用Object.isFrozen()检测对象是否被冻结</li>
  </ul>
  <script>
    'use strict'
    const user = { name: 'Miracle', age: 35 }
    function extend() {
      Object.preventExtensions(user)
      // user.web = 'https://github.com/miracle-git'           // 严格模式下报错，非严格模式忽略
      if (Object.isExtensible(user)) {
        user.web = 'https://github.com/miracle-git'
      }
    }
    // extend()
    function seal() {
      Object.seal(user)
      // user.web = 'https://github.com/miracle-git'          // 严格模式下报错，非严格模式忽略
      // delete user.name
      // Object.defineProperty(user, 'name', {
      //   writable: false,
      //   enumerable: false
      // })
      if (!Object.isSealed(user)) {
        user.web = 'https://github.com/miracle-git'
        delete user.name
        Object.defineProperty(user, 'name', {
          writable: false,
          enumerable: false
        })
      }
    }
    // seal()
    function freeze() {
      Object.freeze(user)
      // user.web = 'https://github.com/miracle-git'
      // delete user.name
      // Object.defineProperty(user, 'name', {
      //   writable: false,
      //   enumerable: false
      // })
      // user.name = 'Miracle He'
      if (!Object.isFrozen(user)) {
        user.web = 'https://github.com/miracle-git'
        delete user.name
        Object.defineProperty(user, 'name', {
          writable: false,
          enumerable: false
        })
        user.name = 'Miracle He'
      }
    }
    // freeze()
  </script>
</body>
</html>